package net.sshiffon;

import java.awt.Container;
import java.awt.GridBagConstraints;
import java.awt.GridBagLayout;
import java.awt.Insets;
import java.awt.event.ComponentAdapter;
import java.awt.event.ComponentEvent;

import javax.swing.JComponent;
import javax.swing.JDialog;
import javax.swing.JLabel;
import javax.swing.JOptionPane;
import javax.swing.JPanel;
import javax.swing.JPasswordField;
import javax.swing.JTextField;
import javax.swing.SwingUtilities;


import com.jcraft.jsch.UIKeyboardInteractive;
import com.jcraft.jsch.UserInfo;

public class SshiffonUserInfo implements UserInfo, UIKeyboardInteractive {
	private JComponent parentComponent;
	
	public SshiffonUserInfo(JComponent parentComponent)
	{
		this.parentComponent= parentComponent;
	}

    public boolean promptYesNo(String str) {
        Object[] options = {"yes", "no"};
        
        int foo = JOptionPane.showOptionDialog(parentComponent, str,
                "Warning", JOptionPane.DEFAULT_OPTION, JOptionPane.WARNING_MESSAGE,
                null, options, options[0]);
        return foo == 0;
    }
    String passwd = null;
    String passphrase = null;
    JTextField pword = new JPasswordField(20);

    public String getPassword() {
        return passwd;
    }

    public String getPassphrase() {
        return passphrase;
    }

    public boolean promptPassword(String message) {
        Object[] ob = {new JLabel("Enter Password"), pword};
        JOptionPane jop = new JOptionPane(ob, JOptionPane.QUESTION_MESSAGE, JOptionPane.OK_CANCEL_OPTION);
        JDialog dialog = jop.createDialog(message);
        dialog.addComponentListener(new ComponentAdapter() {

            public void componentShown(ComponentEvent e) {
                SwingUtilities.invokeLater(new Runnable() {

                    public void run() {
                        pword.requestFocusInWindow();
                    }
                });
                pword.requestFocusInWindow();
            }
        });
        dialog.setVisible(true);
        int result = (Integer) jop.getValue();
        dialog.dispose();
        if (result == JOptionPane.OK_OPTION) {
            passwd = pword.getText();
            return true;
        } else {
            return false;
        }
    }

    public boolean promptPassphrase(String message) {
        return true;
    }

    public void showMessage(String message) {
        JOptionPane.showMessageDialog(null, message);
    }
    final GridBagConstraints gbc = new GridBagConstraints(0, 0, 1, 1, 1, 1,
            GridBagConstraints.NORTHWEST, GridBagConstraints.NONE, new Insets(0, 0,
            0, 0), 0, 0);
    private Container panel;

    public String[] promptKeyboardInteractive(String destination, String name,
            String instruction, String[] prompt, boolean[] echo) {
        panel = new JPanel();
        panel.setLayout(new GridBagLayout());

        gbc.weightx = 1.0;
        gbc.gridwidth = GridBagConstraints.REMAINDER;
        gbc.gridx = 0;
        panel.add(new JLabel(instruction), gbc);
        gbc.gridy++;

        gbc.gridwidth = GridBagConstraints.RELATIVE;

        JTextField[] texts = new JTextField[prompt.length];
        for (int i = 0; i < prompt.length; i++) {
            gbc.fill = GridBagConstraints.NONE;
            gbc.gridx = 0;
            gbc.weightx = 1;
            panel.add(new JLabel(prompt[i]), gbc);

            gbc.gridx = 1;
            gbc.fill = GridBagConstraints.HORIZONTAL;
            gbc.weighty = 1;
            if (echo[i]) {
                texts[i] = new JTextField(20);
            } else {
                texts[i] = new JPasswordField(20);
            }
            panel.add(texts[i], gbc);
            gbc.gridy++;
        }

        if (JOptionPane.showConfirmDialog(parentComponent, panel,
                destination + ": " + name, JOptionPane.OK_CANCEL_OPTION,
                JOptionPane.QUESTION_MESSAGE) == JOptionPane.OK_OPTION) {
            String[] response = new String[prompt.length];
            for (int i = 0; i < prompt.length; i++) {
                response[i] = texts[i].getText();
            }
            return response;
        } else {
            return null; // cancel
        }
    }
}
